import axios from "axios";

import { ElLoading } from "element-plus";

const DEAFULT_LOADING = true;

class Request {
  constructor(config) {
    // 创建axios实例
    this.instance = axios.create(config);

    // 是否显示加载，默认显示
    // ??是指空值合并操作符 逻辑操作符,左侧为null和undefined时,才返回右侧的数
    this.loading = config.loading ?? DEAFULT_LOADING;
    // 单独的请求/响应的拦截器
    this.interceptors = config.interceptors;

    // 2. 添加所有的实例都有的拦截器

    // 全局请求拦截器
    this.instance.interceptors.request.use(
      (config) => {
        if (this.loading) {
          this.loading = ElLoading.service({
            lock: true,
            text: "Loading...",
            background: "rgba(0, 0, 0, 0.5)",
          });
        }
        // console.log(config)
        return config;
      },
      (err) => {
        // 将loading移除
        this.loading?.close?.();
        return err;
      }
    );

    // 全局响应拦截器
    this.instance.interceptors.response.use(
      (res) => {
        this.loading?.close?.();
        // console.log(res);
        const { status, data } = res;
        if (status === 200) {
          if (data.code !== 0) {
            // console.log('error')
            // Message.error(data.message);
            return Promise.reject(data);
          }
          // Message.success(data.message);
          return Promise.resolve(data);
        }
      },
      (err) => {
        // 将loading移除
        this.loading?.close?.();
        console.log(err);
        const { data } = err.response;
        // Message.error(data.message);
        return Promise.reject(data);
      }
    );
    // 使用拦截器
    // 1. 从config中取出的拦截器是对应的实例的拦截器
    this.instance.interceptors.request.use(
      this.interceptors?.requestInterceptor,
      this.interceptors?.requestInterceptorCatch
    );
    this.instance.interceptors.response.use(
      this.interceptors?.responseInterceptor,
      this.interceptors?.responseInterceptorCatch
    );
  }

  request(config) {
    return new Promise((resolve, reject) => {
      // 1. 单个请求对请求config的处理
      if (config.interceptors?.requestInterceptor) {
        config = config.interceptors.requestInterceptor(config);
      }

      // 2. 判断是否需要显示loading
      if (config.loading === false) {
        this.loading = config.loading;
      }

      // 3. 开始请求
      this.instance
        .request(config)
        .then((res) => {
          // 1. 单个请求对返回结果的处理
          if (config.interceptors?.responseInterceptor) {
            res = config.interceptors.responseInterceptor(res);
          }
          // 2. 将loading设置true, 这样不会影响下一个请求
          this.loading = DEAFULT_LOADING;
          // 3. 将结果resolve返回出去
          resolve(res);
        })
        .catch((err) => {
          // 将loading设置true, 这样不会影响下一个请求
          this.loading = DEAFULT_LOADING;
          // 将错误reject返回出去
          reject(err);
        });
    });
  }

  get(config) {
    return this.request({ ...config, method: "GET" });
  }

  post(config) {
    return this.request({ ...config, method: "POST" });
  }

  delete(config) {
    return this.request({ ...config, method: "DELETE" });
  }

  patch(config) {
    return this.request({ ...config, method: "PATCH" });
  }

  put(config) {
    return this.request({ ...config, method: "PUT" });
  }
}

export default Request;
